package Veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import Veterinaria.excepcion.CodigoDuplicadoExcepcion;
import Veterinaria.excepcion.DAOExcepcion;
import Veterinaria.excepcion.ValidaNombreExcepcion;
import Veterinaria.excepcion.ValidaTituloExcepcion;
import Veterinaria.modelo.Paciente;
import Veterinaria.modelo.Publicidad;
import Veterinaria.negocio.GestionPersona;
import Veterinaria.util.ConexionBD;

public class PublicidadDAO extends BaseDAO {

	public Publicidad insertar(Publicidad vo) throws DAOExcepcion,
			CodigoDuplicadoExcepcion, ValidaTituloExcepcion {
		String query = "insert into publicidad(idpublicidad, titulo, contenido, fecha_inicio, fecha_fin, tarifa, num_click, ubicacion) values (?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		if (NoExistePublicidad(vo.getIdpublicidad())) {
			if (vo.getTitulo().isEmpty()) {
				throw new ValidaTituloExcepcion();
			} else {
				try {
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(query);
					stmt.setString(1, vo.getIdpublicidad());
					stmt.setString(2, vo.getTitulo());
					stmt.setString(3, vo.getContenido());
					stmt.setString(4, vo.getFecha_inicio());
					stmt.setString(5, vo.getFecha_fin());
					stmt.setDouble(6, vo.getTarifa());
					stmt.setInt(7, vo.getNum_click());
					stmt.setString(8, vo.getUbicacion());

					int i = stmt.executeUpdate();
					if (i != 1) {
						throw new SQLException("No se pudo insertar");
					}
					// Obtener el ultimo id
					int id = 0;
					String idpublicidad;
					query = "select last_insert_id()";
					stmt = con.prepareStatement(query);
					rs = stmt.executeQuery();
					if (rs.next()) {
						id = rs.getInt(1);
					}
					//
					idpublicidad = id + "";
					//
					vo.setIdpublicidad(idpublicidad);

				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarResultSet(rs);
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
			}
		} else
			throw new CodigoDuplicadoExcepcion(vo.getIdpublicidad());
		return vo;
	}

	private boolean NoExistePublicidad(String codigo) throws DAOExcepcion {
		return obtenerPublicidad(codigo) == null;
	}

	public Publicidad obtenerPublicidad(String idpublicidad)
			throws DAOExcepcion {
		Publicidad vo = new Publicidad();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from publicidad where idpublicidad=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idpublicidad);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdpublicidad(rs.getString(1));
				vo.setTitulo(rs.getString(2));
				vo.setContenido(rs.getString(3));
				vo.setFecha_inicio(rs.getString(4));
				vo.setFecha_fin(rs.getString(5));
				vo.setTarifa(rs.getDouble(6));
				vo.setNum_click(rs.getInt(7));
				vo.setUbicacion(rs.getString(8));

				return vo;
			} else
				return null;

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());

		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

	public Collection<Publicidad> listar() throws DAOExcepcion {
		String query = "select * from publicidad";
		Collection<Publicidad> lista = new ArrayList<Publicidad>();

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Publicidad vo = new Publicidad();
				vo.setIdpublicidad(rs.getString(1));
				vo.setTitulo(rs.getString(2));
				vo.setContenido(rs.getString(3));
				vo.setFecha_inicio(rs.getString(4));
				vo.setFecha_fin(rs.getString(5));
				vo.setTarifa(rs.getDouble(6));
				vo.setNum_click(rs.getInt(7));
				vo.setUbicacion(rs.getString(8));

				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Publicidad GenerarCodigo() throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String Cad = "0";
		Integer Num = 0;
		try {
			String query = "Select max(idpublicidad) as codigo from publicidad";
			Publicidad publicidad = new Publicidad();
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				Cad = rs.getString(1);
				if (Cad == null) {
					Cad = "0000";
				}
			}
			Num = Integer.parseInt(Cad.substring(1, Cad.length()));
			Num = Num + 1;
			String convierte = String.valueOf(Num);
			String codigo = "000" + convierte;

			if (4 <= codigo.length()) {
				int Inicio = (codigo.length() - 4);
				codigo = codigo.substring(Inicio, codigo.length());
			} else {
				codigo = Cad;
			}
			codigo = "P" + codigo;
			publicidad.setIdpublicidad(codigo);

			return publicidad;

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

}
